package com.neuron.trafikanten.tasks; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.location.Address; import android.location.Geocoder; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.view.Window; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.google.android.AnalyticsUtils; import com.neuron.trafikanten.R; import com.neuron.trafikanten.tasks.handlers.ReturnCoordinatesHandler; public class SearchAddressTask implements GenericTask { private static final String TAG = "Trafikanten-SearchAddressTask"; private Activity activity; private List<Address> addresses; ReturnCoordinatesHandler handler; private Dialog dialog; public SearchAddressTask(Activity activity, ReturnCoordinatesHandler handler) { this.activity = activity; AnalyticsUtils.getInstance(activity).trackPageView("/task/searchAddress"); this.handler = handler; showAddressField(); } /* * Show the address field dialog and wait for input */ private void showAddressField() { dialog = new Dialog(activity); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dialog_searchaddress); final TextView message = (TextView) dialog.findViewById(R.id.message); message.setText(R.string.searchAddressTask); final EditText searchEdit = (EditText) dialog.findViewById(R.id.search); searchEdit.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() != KeyEvent.ACTION_DOWN) { return false; } switch (keyCode) { case KeyEvent.KEYCODE_ENTER: case KeyEvent.KEYCODE_DPAD_CENTER: dialog.dismiss(); geoMap(searchEdit.getText().toString()); return true; } return false; } }); /* * Handler onCancel */ dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { handler.onCanceled(); } }); dialog.show(); } private void showAddressSelection() { final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.searchAddressTask); final List<Address> duplicateAddresses = new ArrayList<Address>(); /* * First take all addresses, convert them into strings * remove duplicates so addressStrings index matches address index */ ArrayList<String> addressStrings = new ArrayList<String>(); for(Address address : addresses) { Log.d(TAG,"Got address " + address.toString()); String result = address.getAddressLine(0); for (int i = 1; i <= address.getMaxAddressLineIndex(); i++) { result = result + ", " + address.getAddressLine(i); } if (!addressStrings.contains(result)) { addressStrings.add(result); } else { duplicateAddresses.add(address); Log.d(TAG, " - Address is dupe!"); } } /* * Remove duplicates */ while(duplicateAddresses.size() > 0) { addresses.remove(duplicateAddresses.get(0)); duplicateAddresses.remove(0); } /* * Then convert it into the array setItems wants */ final String[] items = new String[addressStrings.size()]; addressStrings.toArray(items); /* * Then search for the address */ builder.setItems(items, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SearchAddressTask.this.foundLocation(addresses.get(which)); } }); dialog = builder.create(); /* * Handler onCancel */ dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { handler.onCanceled(); } }); dialog.show(); } /* * Do geo mapping. */ private void geoMap(String searchAddress) { final Geocoder geocoder = new Geocoder(activity); try { addresses = geocoder.getFromLocationName(searchAddress, 10, 57, 3, 71, 32); switch(addresses.size()) { case 0: Toast.makeText(activity, R.string.failedToFindAddress, Toast.LENGTH_SHORT).show(); handler.onCanceled(); break; case 1: foundLocation(addresses.get(0)); break; default: showAddressSelection(); break; } } catch (IOException e) { /* * Pass exceptions to parent */ handler.onError(e); } } private void foundLocation(Address location) { handler.onFinished(location.getLatitude(), location.getLongitude()); } @Override public void stop() { handler.onCanceled(); dialog.dismiss(); } }